class Request {
  default = {
    baseUrl: '',//基地址
    url: '',
    data: null,//请求体
    header: {
      'Content-type': 'application/json' // 设置数据的交互格式
    },
    timeout: 60000,//超时时间

  }
  // 拦截器
  interceptors = {
    request: config => config,
    response: response => response
  }
  // 构造方法
  constructor(options) {
    this.default = Object.assign({}, this.default, options)
  }
  // 发起请求的实例方法
  request(options) {
    // 对基地址进行拼接，形成完整请求地址
    options.url = this.default.baseUrl + options.url
    options = {
      ...this.default,
      ...options
    }
    options = this.interceptors.request(options)
    return new Promise((resolve, reject) => {
      if (options.method === 'UPLOAD') {
        // 上传文件api
        wx.uploadFile({
          ...options,
          //成功回调
          success: (res) => {
            res.data = JSON.parse(res.data)
            const mergetRes = Object.assign({}, res, {
              config: options,
              isSuccess: true
            })
            resolve(this.interceptors.response(mergetRes))
          },
          // 失败回调
          fail: (err) => {
            const mergetErr = Object.assign({}, err, {
              config: options,
              isSuccess: false
            })
            reject(this.interceptors.response(mergetErr))
          }
        })
      } else {
        wx.showLoading({
          title: '加载中'
        })
        // 网络请求api
        wx.request({
          ...options,
          // 成功回调
          success: (res) => {
            const mergetRes = Object.assign({}, res, {
              config: options,
              isSuccess: true
            })
            resolve(this.interceptors.response(mergetRes))
          },
          // 失败回调
          fail: (err) => {
            const mergetErr = Object.assign({}, err, {
              config: options,
              isSuccess: false
            })
            reject(this.interceptors.response(mergetErr))
          },
          // 不管成功失败都会执行
          complete: () => {
            setTimeout(() => {
              wx.hideLoading()
            }, 300);
          }
        })
      }

    })
  }
  upload(url, filePath, name = 'file',config={}) {
    /**
     * @description 上传文件的实例方法
     * @param {String} url 开发者服务器地址 
     * @param {String} filePath 要上传文件资源的路径 (本地路径)
     * @param {String} name 文件对应的 key，开发者在服务端可以通过这个 key 获取文件的二进制内容
     */
    return this.request(Object.assign( {
      url,
      filePath,
      name,
         //标识符
         method:'UPLOAD'
    },config))

  }
}

export default Request